Forum des exercices du projet Zuul

Exercice 7.6

  
 
Avatar anonfirstname2 anonlastname2
Exercice 7.6
par anonfirstname2 anonlastname2, mercredi 10 février 2021, 15:45
 
  1. Lire la suite du chapitre 7 [ci-joint] (si possible en anglais, sinon en français).
    La version de setExits proposée dans le livre teste si chaque paramètre est null avant de l'affecter à l'attribut correspondant, mais ce n'est pas indispensable. Comprenez-vous pourquoi ?

  2. Effectuer les modifications qui y sont décrites dans les classes Room et Game.

  3. Pour résoudre le problème du message "Unknown direction", voir les 3 solutions possibles proposées dans les échanges ci-dessous.

Pour information, l'exercice 7.8.1 vous demandera d'ajouter au moins un lieu dans une direction haut et/ou bas.


Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, mardi 15 mars 2016, 15:16
 

Un étudiant a écrit :

Bonjour, je suis bloqué à l'exercice 7.6, j'ai effectué les modifications demandées au niveau de la classe Room, mais lorsque je compile la classe Game, il y'a un problème au niveau de la methode "getExit". C'est en rapport avec le type, mais je vois pas ce que je peux faire. Merci de votre réponse, cordialement


Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, mardi 15 mars 2016, 15:26
 

Si vous voulez que je trouve votre erreur, ce que vous pouvez faire (dans un premier temps) est :
- recopier ici la ligne où se produit l'erreur,
- recopier ici le message d'erreur.

Mais vous pouvez sans doute trouver vous-même votre erreur :
si votre ligne est de la forme variable = objet.getExit(paramètre);
et que l'erreur "est en rapport avec un type" comme vous dites,
soit le paramètre n'est pas du même type que celui déclaré dans getExit,
soit la valeur retournée par getExit n'est pas du même type que la variable.

Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, mardi 15 mars 2016, 16:02
 

L'étudiant a répondu :

L'erreur se trouve dans le procédure createRoom lorsque que j'ecris : vOutside.getExit (null,vBigroom, vToilets,vBar)

Et le message d'erreur : method getExit in v1.Room cannot be applied to given type 

Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, mardi 15 mars 2016, 16:13
 

Le message d'erreur signifie qu'il y a une différence de type (et de nombre) de paramètres entre l'appel de getExit que vous montrez (avec 4 paramètres de type Room) et la déclaration de getExit dans la classe Room qui, je suppose, n'attend qu'un seul paramètre (une String).

Vous semblez donc ne pas avoir compris à quoi sert la fonction getExit : on lui passe une direction (nord, sud, est, ou ouest) et elle doit nous retourner la Room qui se trouve dans cette direction (ou null s'il n'y a pas de sortie dans cette direction).
Elle correspond exactement à la partie 4.b.3 du TP 3.1.

Si tout ça ne vous suffit pas à régler ce problème, mettez votre projet sur votre compte esiee (s'il n'y est pas déjà) et venez en 5356.

Avatar Salahedine ABDELKRIM
Re: Exercice 7.6
par Salahedine ABDELKRIM, mercredi 28 septembre 2016, 09:35
 
Dans la méthode goRoom de ma classe Game, je souhaite appeler la methode getExit de la classe Room afin d'éviter la duplication de code.

Voici mon message d'erreur de cette ligne d'instruction:
Room nextRoom = currentRoom.getExit(pDirection);
cannot find variable symbol - variable pDirection

(pDirection est mon seul paramètre de la methode getExit, il est du type String)
Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, mercredi 28 septembre 2016, 13:27
 

L'erreur "cannot find variable symbol - variable pDirection" signifie qu'il n'y a pas de paramètre pDirection dans la méthode que vous êtes en train d'écrire (vous confondez avec le nom du paramètre de la méthode que vous voulez appeler).

Vous voulez appeler la méthode getExit : il faut lui passer une String qui est à votre disposition dans la méthode que vous êtes en train d'écrire.

Où est stockée le mot contenant la direction dans laquelle vous voulez aller ?

Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, dimanche 24 septembre 2017, 23:04
 

Un étudiant a écrit :

Bonjour,
Juste pour etre sur pour cette exercice, il est dit de modifié go Room , create Room et printWelcome. Mais en fait printWelcome  appelle la méthode printLocationInfo. Donc c'est la méthode printLocationInfo qu'il faut modifié?
Merci.

Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, dimanche 24 septembre 2017, 23:07
 

Il n'est pas dit explicitement qu'il faut modifier createRooms.

Par contre, on pourrait effectivement comprendre qu'il faut modifier goRoom et printWelcome, alors que leur partie commune a été transférée dans printLocationInfo ; c'est donc bien cette dernière qu'il faudra modifier.

Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, lundi 12 février 2018, 14:11
 

Un étudiant a écrit :

après avoir rajouté la méthode getExit( ) dans la classe Room
je ne comprends pas ce qu’il faut changer dans la classe Game,
car dans le pdf ils disent de remplacer une partie de la méthode de goRoom avec la méthode getExit
mais je ne vois pas ce qu’il faut remplacer.

Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, lundi 12 février 2018, 14:18
 

1) à quoi sert la fonction getExit ? (*)

2) comment (et où) cette tâche est-elle actuellement accomplie dans la méthode goRoom ?

3) c'est à ces endroits qu'il faudra remplacer votre code actuel par des appels à la fonction getExit.

(*) si vous ne vous sentez pas capable de répondre à cette question,
demandez-vous pour cette fonction, quelle valeur elle prend en paramètre et quelle valeur elle retourne.

Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, mardi 2 octobre 2018, 18:16
 

Des étudiants ont demandé :

Lorsqu'on remplace la suite de if/else par un seul appel à getExit comme c'est expliqué dans le livre, on perd la possibilité de tester si on a tapé un mauvais nom de direction.

Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, mercredi 10 février 2021, 15:39
 

Très bonne remarque !

Le livre ne traite pas ce cas-là, alors que je l'ai ajouté dans le TP 3.1.

Pour s'en sortir, je vois au moins 2 solutions :

  1. getExit pourrait retourner null aussi quand c'est une mauvaise direction, et goRoom dirait alors "There's no door or unknown direction !" quand vNextRoom vaut null.
    Inconvénient : deux erreurs différentes génèrent le même message (du coup, le joueur est moins bien renseigné).

  2. getExit pourrait retourner this quand c'est une mauvaise direction, et goRoom pourrait alors dire "Unknown direction !" quand vNextRoom vaut this.aCurrentRoom (puisque c'est sur cette pièce qu'on appelle getExit).
    Inconvénient : si un jeu tordu veut qu'en allant au nord d'une pièce, on se retrouve dans la même pièce, ce ne sera pas possible (le concepteur du jeu se prive d'une possibilité, mais extrêmement rare).
Avatar Raphaël CANIN
Re: Exercice 7.6
par Raphaël CANIN, vendredi 9 octobre 2020, 15:52
 

Bonjour Monsieur,


N'est-il pas plus simple de rajouter directement S.o.println("Unknown Direction"); dans setExit(.) ?

Ça donnerait quelque chose du genre :

public Room getExit (final String pDirection){

...

else {

            System.out.println("Unknown direction !");

            return null;}

}

Il faudrait bien sûr ensuite trouver un moyen pour ne pas afficher "There is no door"

EDIT : Après réflexion, c'est vrai qu'il est bien plus simple d'utiliser le this même si ça peut limiter la créativité.


Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, vendredi 9 octobre 2020, 18:17
 

Bravo d'avoir compris que ce n'est finalement pas plus simple.

Mais il y aurait 2 autres inconvénients :

  • la fonction n'est pas censée produire d'affichage, par exemple si on veut juste tester si une direction existe
  • et même si on l'autorisait à afficher, que se passe-t-il quand on modifie l'interface textuelle en interface graphique : on serait obligé de modifier la classe Room !?
Mais regardez ci-dessous la solution que propose un autre étudiant, puis son amélioration.
Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, vendredi 9 octobre 2020, 18:28
 

Baudouin CORTES a écrit :

je pense avoir trouvé une troisième alternative qui permet de générer le message correspondant à chaque erreur et qui ne prive pas le concepteur du jeu de rester dans la même pièce en allant au nord de celle-ci.

Voici mon code, je ne sais pas s'il est très propre mais cela a l'air de fonctionner :

Dans Room j'ai ajouté et modifié :
  private static Room sUnkown;
  static {sUnkown = new Room("Unkown direction !");}

et à la fin de getExit :
return sUnkownn;

Dans Game j'ai modifié :
Dans createRooms :
  Room vUnknown = new Room("Unknown direction !");

Et dans goRoom :
  else if (vNextRoom == this.aCurrentRoom.getExit("")) {
      System.out.println("Unknown direction !");
      return;
  }

Pourriez-vous me dire ce que vous en pensez ?

Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, mercredi 10 février 2021, 15:41
 

Je pense que c'est une très bonne idée. Je vais juste l'améliorer ci-dessous.

Solution 3 :

Au début de Room :
    public static final Room UNKNOWN_DIRECTION = new Room( "nowhere" );

A la fin de getExit :
    return UNKNOWN_DIRECTION;

Dans goRoom :
    if (vNextRoom == Room.UNKNOWN_DIRECTION) {
        System.out.println( "Unknown direction !" );
        return;
    }

Avatar Nathan SAUCET
Re: Exercice 7.6
par Nathan SAUCET, vendredi 2 octobre 2020, 14:45
 

Bonjour Monsieur,

j'ai une question concernant la méthode printLocationInfo().

Suite à l'ajout de la HashMap je me suis dit que cela serai plus simple de faire une boucle dessus puis d'afficher une a une les sorties non null plutot que de faire un if pour chaque cas.

Or printLocationInfo() est dans Game donc on a pas accès à cette HashMap.

Alors je me suis dit qu'on pourrait déléguer le travaille de cette méthode à la méthode toString() de Room qu'on créerais et qui elle aurait par définition accès à cette HashMap. Elle afficherait donc les infos que printLocationInfo est censé afficher ( ou simplement utiliser uniquement toString() à la place de printLocationInfo  ).

Puis-je réaliser ceci ?


Avatar Denis BUREAU
Re: Exercice 7.6
par Denis BUREAU, samedi 3 octobre 2020, 12:55
 

Ce sont de bonnes idées : ces améliorations sont effectuées à l'exercice suivant.

Attention à ne pas confondre un affichage, avec toString qui n'affiche rien.